const mysql = require('mysql2/promise');

//直接使用 mysql2 很麻烦  使用ORM  可以简化操作

// createPool 连接池
// 连接池 是 一个 容器  里面 存放着 很多 连接
// 如果使用 createConnection 链接  因为 链接 建立太多了 没关 就会卡
// 绝大多时候 使用 createPool 链接池 设置有最大链接说法 当满了 必须排队
// 会自动处理链接池的回收
const pool = mysql.createPool({
  host: 'localhost', // 数据库所在的机器的ip地址
  user: 'root', // 数据库的用户名
  password: '12345678', // 数据库的密码
  database: 'companydb', // 数据库的名称
  connectionLimit: 10, // 最大连接数
  queueLimit: 0, // 0的话  不限制排队数
  waitForConnections: true, // 当连接池满了  是否等待连接池释放 false 的话满了 再来链接 就报错
  // multipleStatements: true, // 只允许执行一个sql语句 但有时候 需要执行多个sql语句
});

async function test(id) {
  // 创建一个数据库连接
  // mysql2 支持 变量 变量里面的 内容不作为任务sql关键字
  // const sql = `select * from company where id=?;`;
  //  \` 转义符  可以把 关键字 转义成 普通字符
  // concat('%', ?, '%') 模糊查询  concat 链接 % ？ % 如果直接写 %？% 会直接匹配 %？% 而不是 模糊查询
  const sql = `select * from employee where \`name\` like concat('%', ?, '%') ;`;
  // pool.execute 预编译sql语句  防止sql注入  编译好后 sql 语句结构 就不会被改变了
  // 以后只能使用 execute 不要使用 query
  const [results] = await pool.execute(sql, [id]);
  console.log(results);
}
test('袁');
// sql注入 很危险
// test(`'';delete from company where id=1;`);

// 这种就是运行一次 创建一次链接
async function test1() {
  // 创建一个数据库连接
  const connection = await mysql.createConnection({
    host: 'localhost', // 数据库所在的机器的ip地址
    user: 'root', // 数据库的用户名
    password: '12345678', // 数据库的密码
    database: 'companydb', // 数据库的名称
  });
  //   console.log(connection);
  const [results] = await connection.query('SELECT * FROM `company`;');
  console.log(results);
  connection.end();
}
test1();
